package web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.PostConstruct;

import org.primefaces.model.DashboardColumn;
import org.primefaces.model.DashboardModel;
import org.primefaces.model.DefaultDashboardColumn;
import org.primefaces.model.DefaultDashboardModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import service.GrupoProdutoService;
import service.MarcaService;
import service.ProdutoService;
import service.VendaService;
import to.ProdutoPorQuantidadeTO;
import to.QtdaVendaProduto;
import util.UtilColecao;
import util.UtilMensagem;
import entity.Produto;

@Controller
@Scope("request")
public class AdministracaoMB extends BaseManagedBean implements Serializable {

	private static final long serialVersionUID = 2980992478110115218L;

	@Autowired
	private ProdutoService produtoService;

	@Autowired
	private GrupoProdutoService grupoProdutoService;

	@Autowired
	private MarcaService marcaService;

	@Autowired
	private VendaService vendaService;

	private int qtdaProduto;

	private int qtdaMarcas;

	private int qtdaGrupos;

	private String msgItensVendidos;

	private DashboardModel model;

	private List<Produto> listaProdutoAbaixoEstoque;

	private List<ProdutoPorQuantidadeTO> produtosMaisVendidosNaSemana;

	private List<ProdutoPorQuantidadeTO> produtosMenosVendidosNaSemana;

	private final static int qTDA_PRODUTOS_EXIBIDOS = 5;

	public List<Produto> getListaProdutoAbaixoEstoque() {
		return listaProdutoAbaixoEstoque;
	}

	@PostConstruct
	public void postConstruct() {
		iniciar();
	}

	private void iniciar() {
		qtdaProduto = produtoService.buscarQuantidadeTotalAtivos();
		qtdaMarcas = marcaService.buscarQuantidadeTotalAtivos();
		qtdaGrupos = grupoProdutoService.buscarQuantidadeTotalAtivos();

		final QtdaVendaProduto qtdaVendaProduto = vendaService
				.buscarQuantidadeVendasNoDia();

		if (qtdaVendaProduto.getQtdaVenda() > 0) {

			msgItensVendidos = String.format(
					UtilMensagem.getMensagem("MSG_0033"),
					qtdaVendaProduto.getQtdaProduto(),
					qtdaVendaProduto.getQtdaVenda());

		} else {
			msgItensVendidos = UtilMensagem.getMensagem("MSG_0035");
		}

		listaProdutoAbaixoEstoque = produtoService
				.buscarProdutosComEstoqueAbaixoLimiteMinino();

		final List<ProdutoPorQuantidadeTO> lista = produtoService
				.buscarProdutosMaisVendidosNaSemana();
		montarListaProdutoMaisVendidos(lista);
		montarListaProdutoMenosVendidos(lista);
		montarDashboard();
	}

	private void montarListaProdutoMaisVendidos(
			final List<ProdutoPorQuantidadeTO> lista) {
		if (!UtilColecao.isColecaoVazia(lista)
				&& lista.size() > qTDA_PRODUTOS_EXIBIDOS) {
			produtosMaisVendidosNaSemana = lista.subList(0,
					qTDA_PRODUTOS_EXIBIDOS - 1);
		} else {
			produtosMaisVendidosNaSemana = lista;
		}
	}

	private void montarListaProdutoMenosVendidos(
			final List<ProdutoPorQuantidadeTO> lista) {
		final List<ProdutoPorQuantidadeTO> listaInvertida = new ArrayList<ProdutoPorQuantidadeTO>(
				lista);
		Collections.reverse(listaInvertida);

		if (!UtilColecao.isColecaoVazia(listaInvertida)
				&& listaInvertida.size() > qTDA_PRODUTOS_EXIBIDOS) {
			produtosMenosVendidosNaSemana = listaInvertida.subList(0,
					qTDA_PRODUTOS_EXIBIDOS - 1);
		} else {
			produtosMenosVendidosNaSemana = listaInvertida;
		}
	}

	private void montarDashboard() {
		model = new DefaultDashboardModel();
		DashboardColumn column1 = new DefaultDashboardColumn();
		DashboardColumn column2 = new DefaultDashboardColumn();
		DashboardColumn column3 = new DefaultDashboardColumn();

		column1.addWidget("painelMaisVendidos");
		column1.addWidget("painelUltimasVendas");

		column2.addWidget("painelMenosVendidos");
		column2.addWidget("painelComprasVendas");

		column3.addWidget("painelMarcasPreferidas");

		model.addColumn(column1);
		model.addColumn(column2);
		model.addColumn(column3);
	}

	public DashboardModel getModel() {
		return model;
	}

	public String getMsgItensVendidos() {
		return msgItensVendidos;
	}

	public int getQtdaProduto() {
		return qtdaProduto;
	}

	public int getQtdaMarcas() {
		return qtdaMarcas;
	}

	public int getQtdaGrupos() {
		return qtdaGrupos;
	}

	public List<ProdutoPorQuantidadeTO> getProdutosMaisVendidosNaSemana() {
		return produtosMaisVendidosNaSemana;
	}

	public List<ProdutoPorQuantidadeTO> getProdutosMenosVendidosNaSemana() {
		return produtosMenosVendidosNaSemana;
	}

}
